package com.gitee.zhuyb;

import com.gitee.zhuyb.util.WordUtil;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFChart;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFPictureData;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

/**
 * @version 1.0.0
 * @Description: #类描述
 * @Date: 2021/12/25 15:01
 * @Copyright (C) ZhuYouBin
 */
public class Test {
    static final String templateurl = "G:\\zhuyoubin_gitee_space\\code\\work-demo\\poi-word\\src\\main\\resources\\demo模板.docx";
    public static void main(String[] args) throws Exception {
        XWPFDocument document = WordUtil.createDocument(templateurl);
        List<XWPFChart> charts = document.getCharts();

        XWPFChart chart = charts.get(0);

        // create data sources
//        String[] categories = new String[] { "Lang 1", "Lang 2", "Lang 3" };
        String[] categories = new String[] { "分类1", "分类2", "分类3" };
        Double[] valuesA = new Double[] { 70d, 50d, 90d };
        int numOfPoints = categories.length;
        String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
        String valuesDataRangeA = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
        String valuesDataRangeB = chart.formatRange(new CellRangeAddress(1, numOfPoints, 2, 2));
        XDDFDataSource<String> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0);
        XDDFNumericalDataSource<Double> valuesDataA = XDDFDataSourcesFactory.fromArray(valuesA, valuesDataRangeA, 1);

        // create axis
        XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
        XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
        leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
        // Set AxisCrossBetween, so the left axis crosses the category axis between the categories.
        // Else first and last category is exactly on cross points and the bars are only half visible.
        leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);

        // create chart data
        XDDFChartData data = chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);
        ((XDDFBarChartData) data).setBarDirection(BarDirection.COL);

        // create series
        // if only one series do not vary colors for each bar
        ((XDDFBarChartData) data).setVaryColors(false);
        XDDFChartData.Series series = data.addSeries(categoriesData, valuesDataA);
        // XDDFChart.setSheetTitle is buggy. It creates a Table but only half way and incomplete.
        // Excel cannot opening the workbook after creatingg that incomplete Table.
        // So updating the chart data in Word is not possible.
        // series.setTitle("a", chart.setSheetTitle("a", 1));
        series.setTitle("a", setTitleInDataSheet(chart, "a", 1));

			/*
			   // if more than one series do vary colors of the series
			   ((XDDFBarChartData)data).setVaryColors(true);
			   series = data.addSeries(categoriesData, valuesDataB);
			   //series.setTitle("b", chart.setSheetTitle("b", 2));
			   series.setTitle("b", setTitleInDataSheet(chart, "b", 2));
			*/

        // plot chart data
        chart.plot(data);

        // create legend
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.LEFT);
        legend.setOverlay(false);


//			// Write the output to a file
        try (FileOutputStream fileOut = new FileOutputStream("H:\\poi\\CreateWordXDDFChart.docx")) {
            document.write(fileOut);
        }
    }

    static CellReference setTitleInDataSheet(XWPFChart chart, String title, int column) throws Exception {
        XSSFWorkbook workbook = chart.getWorkbook();
        XSSFSheet sheet = workbook.getSheetAt(0);
        XSSFRow row = sheet.getRow(0);
        if (row == null)
            row = sheet.createRow(0);
        XSSFCell cell = row.getCell(column);
        if (cell == null)
            cell = row.createCell(column);
        cell.setCellValue(title);
        return new CellReference(sheet.getSheetName(), 0, column, true, true);
    }
}
